package com.shujia.wyh.day19;

import java.util.ArrayList;
import java.util.Iterator;

/*
        使用ArrayList存储自定义对象并去重（成员变量的值都相同的时候，就重复）
        我们按照处理字符串相同的方式来处理相同自定义对象，结果发现并没有进行去重
        为什么呢？
        想要知道为什么，首先得分析出问题出现在哪一行代码
        经过简单的分析后得出，问题出现在if判断中，发现只有当if判断为true的时候，才会将元素添加到集合中。
        说明我们这边的判断结果一直是true,去掉！，说明contains()方法的结果一直是false,
        怎么去改呢？得先搞明白说明contains方法内部是怎么实现的，所以我们得去看源码。

        通过观察源码发现，contains()底层调用得是元素类型中equals方法，而我们自定义类Student类中并没有equals方法
        所以调用的是父类Object类中equals方法，而Object类中的equals方法比较的是地址值，又因为每一个学生对象都是new出来的
        地址值必然不一样，所以equals比较的结果永远是false,contains比较的结果永远是false,加上！结果永远是true，所以通通
        添加到新集合，最终出现没有去重的现象。

        怎么解决呢？元素类重写equals()方法

 */
public class ArrayListDemo3 {
    public static void main(String[] args) {
        //创建ArrayList集合对象
        ArrayList arrayList1 = new ArrayList();

        //创建学生对象
        Student s1 = new Student("张飞", 18);
        Student s2 = new Student("关羽", 17);
        Student s3 = new Student("张飞", 18);
        Student s4 = new Student("赵云", 19);
        Student s5 = new Student("张飞", 18);

        //将学生对象添加到集合中
        arrayList1.add(s1);
        arrayList1.add(s2);
        arrayList1.add(s3);
        arrayList1.add(s4);
        arrayList1.add(s5);
        System.out.println("去重之前的集合为：" + arrayList1);
        System.out.println("===========================================");
        //创建新的集合存储去重后的元素
        ArrayList arrayList2 = new ArrayList();
        //遍历旧的集合获取元素
        Iterator iterator = arrayList1.iterator();
        while (iterator.hasNext()) {
            Student s = (Student) iterator.next();

            if (!arrayList2.contains(s)) {
                arrayList2.add(s);
            }
        }

        System.out.println("去重后的集合为：" + arrayList2);
    }
}
